Parte 3 (2 horas)
En esta parte y la siguiente vamos a implementar lexers para los 4 lenguajes planteados anteriormente. En la carpeta parte3
se encuentran los siguientes elementos importantes:
LanguageAutomata.java
: Una interfaz que se usa para representar toda la informaci贸n necesaria para expresar una aut贸mata capaz de parsear un lenguaje:Funci贸n de transici贸n
Funci贸n que dice si un estado es final
Funci贸n que dice cu谩l es el estado "muerto", que es el que no tiene transiciones salientes.
otras cosas necesarias para definir el aut贸mata
La interfaz tiene 2 tipos gen茅ricos. El tipo
S
es el tipo de los estados, yT
representa los tipos de token. As铆, la interfaz nos permite cambiar los tipos enumerados que se usan en el lenguaje.
ManualLexer.java
: A partir de un aut贸mata que implementaLanguageAutomata
, implementa un algoritmo que convierte strings en tokens "observando" el comportamiento de la funci贸n de transici贸n. Expone 2 m茅todos, que deben completarse como parte del alcance de este laboratorio:extractToken(String program)
avanza por elString
recibido como par谩metro hasta alcanzar un estado muerto del aut贸mata. Entonces devuelve el token correspondiente al 煤ltimo estado final, y la posici贸n del 煤ltimo caracter donde se lo alcanz贸.lex(String program)
Llama constantemente aextractToken()
, hasta consumir la totalidad del programa.
- Carpeta
BrainfuckAdder
: Contiene el aut贸mata y los tipos enumerados correspondientes a ese lenguage.
Por otra parte, en la carpeta de nombre parte3
dentro de test
se encuentra ManualLexerTest
, que usa la implementaci贸n de BrainfuckAdder
inclu铆da para testear ManualLexer
.
#
ConsignaCompletar ManualLexer.java de forma que pasen los tests en ManualLexerTest.java. Se recomienda iniciar por los tests de extractToken
y luego continuar con los de lex
. No se permite modificar los tests de ManualLexerTest.java
, si se considera necesario agregar m谩s pruebas, crear un archivo con pruebas adicionales.
#
Consejos- Hacer pasar primero los tests que eval煤an la funci贸n
extractToken
, y luego pasar a los tests delex
. - En el texto tiger, secci贸n 2.3, subt铆tulo RECOGNIZING THE LONGEST MATCH se describe el algoritmo que "observa" al aut贸mata. No incluye una descripci贸n formal del pseudoc贸digo.
#
pseudoc贸digoSe propone a continuaci贸n un pseudoc贸digo aproximado de los m茅todos a completar como parte de la consigna. No copiarlo tal cual ya que se excluyeron detalles importantes tales como 铆ndices, excepciones, algunas variables, etc.
extractToken(programa){ estadoActual= ESTADO_INICIAL ultimoEstadoFinal=ninguno for(cada caracter del programa){ estadoActual= TRANSCICION(estadoActual,caracter) if(ES_FINAL(estadoActual)){ ultimoEstadoFinal=estadoActual } if(estadoActual=ESTADO_MUERTO){ return ultimoEstadoFinal, posfinal } }}
lex(programa){ tokens=[] while(programa no est谩 vac铆o){ token = extractToken(programa) programa = programa sin los caracteres del token tokens.agregar( token ) }}